﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ReconocedorSonidosVocales
{
    public class ConjuntoMuestras
    {
        public List<Muestra> muestrasA;

        public List<Muestra> muestrasE;

        public List<Muestra> muestrasI;

        public List<Muestra> muestrasO;

        public List<Muestra> muestrasU;
        public List<Muestra> todasMuestrasAEntrenar;
        public List<Muestra> todasMuestrasRestantesAProbar;

        public int cantidadMuestrasAProbarA, cantidadMuestrasAProbarE, cantidadMuestrasAProbarI, cantidadMuestrasAProbarO, cantidadMuestrasAProbarU;

        public String tipo;
        public Random random;
        public int vectorSize;
        public ConjuntoMuestras(String tipo) {
            random = new Random();
            muestrasA = new List<Muestra>();

            muestrasE = new List<Muestra>();

            muestrasI = new List<Muestra>();

            muestrasO = new List<Muestra>();

            muestrasU = new List<Muestra>();


            todasMuestrasAEntrenar = new List<Muestra>();
            todasMuestrasRestantesAProbar = new List<Muestra>();
            this.tipo = tipo;
            switch (tipo)
            {
                case "mfcc":
                 //   MessageBox.Show("No especificado");
                    this.vectorSize = 500;
                    break;
                case "lpc":
                 //   MessageBox.Show("No especificado");
                    this.vectorSize = 512;//tamanyo del vector
                    break;
                case "cepstrum":
                //    MessageBox.Show("No especificado");
                    this.vectorSize = 20;
                    break;
                default:
                 //   MessageBox.Show("No especificado");
                    break;

            }
        }
        /// <summary>
        /// Selecciona aleatoriamente muestras de la lista original y las pasa a una lista exclusiva de muestras de entrenamiento, aleatorio porque el orden puede afectar la efectividad de la red
        /// </summary>
        /// <param name="porcentajeAEntrenar">The porcentaje A entrenar.</param>
        public void seleccionarMuestrasAEntrenar(Double porcentajeAEntrenar) {

            int cantidadMuestrasAEntrenarA = (Int32)(((Double)muestrasA.Count) * (porcentajeAEntrenar / 10.0));
            cantidadMuestrasAProbarA=((Int32)((Double)muestrasA.Count))-cantidadMuestrasAEntrenarA;

            int cantidadMuestrasAEntrenarE = (Int32)(((Double)muestrasE.Count) * (porcentajeAEntrenar / 10.0));
            cantidadMuestrasAProbarE = ((Int32)((Double)muestrasE.Count)) - cantidadMuestrasAEntrenarE;

            int cantidadMuestrasAEntrenarI = (Int32)(((Double)muestrasI.Count) * (porcentajeAEntrenar / 10.0));
            cantidadMuestrasAProbarI = ((Int32)((Double)muestrasI.Count)) - cantidadMuestrasAEntrenarI;

            int cantidadMuestrasAEntrenarO = (Int32)(((Double)muestrasO.Count) * (porcentajeAEntrenar / 10.0));
            cantidadMuestrasAProbarO = ((Int32)((Double)muestrasO.Count)) - cantidadMuestrasAEntrenarO;

            int cantidadMuestrasAEntrenarU = (Int32)(((Double)muestrasU.Count) * (porcentajeAEntrenar / 10.0));
            cantidadMuestrasAProbarU = ((Int32)((Double)muestrasU.Count)) - cantidadMuestrasAEntrenarU;

            int indiceElementoSeleccionadoParaSerEntrenado;

            for (int i = 0; i < cantidadMuestrasAEntrenarA; i++ )
            {
                indiceElementoSeleccionadoParaSerEntrenado = random.Next(0, muestrasA.Count);
                todasMuestrasAEntrenar.Add(muestrasA[indiceElementoSeleccionadoParaSerEntrenado]);//voy agregando aleatoriamente las muestras a entrenar
                muestrasA.RemoveAt(indiceElementoSeleccionadoParaSerEntrenado);
            }
            for (int i = 0; i < cantidadMuestrasAEntrenarE; i++)
            {
                indiceElementoSeleccionadoParaSerEntrenado = random.Next(0, muestrasE.Count);
                todasMuestrasAEntrenar.Add(muestrasE[indiceElementoSeleccionadoParaSerEntrenado]);//voy agregando aleatoriamente las muestras a entrenar
                muestrasE.RemoveAt(indiceElementoSeleccionadoParaSerEntrenado);
            }
            for (int i = 0; i < cantidadMuestrasAEntrenarI; i++)
            {
                indiceElementoSeleccionadoParaSerEntrenado = random.Next(0, muestrasI.Count);
                todasMuestrasAEntrenar.Add(muestrasI[indiceElementoSeleccionadoParaSerEntrenado]);//voy agregando aleatoriamente las muestras a entrenar
                muestrasI.RemoveAt(indiceElementoSeleccionadoParaSerEntrenado);
            }
            for (int i = 0; i < cantidadMuestrasAEntrenarO; i++)
            {
                indiceElementoSeleccionadoParaSerEntrenado = random.Next(0, muestrasO.Count);
                todasMuestrasAEntrenar.Add(muestrasO[indiceElementoSeleccionadoParaSerEntrenado]);//voy agregando aleatoriamente las muestras a entrenar
                muestrasO.RemoveAt(indiceElementoSeleccionadoParaSerEntrenado);
            }
            for (int i = 0; i < cantidadMuestrasAEntrenarU; i++)
            {
                indiceElementoSeleccionadoParaSerEntrenado = random.Next(0, muestrasU.Count);
                todasMuestrasAEntrenar.Add(muestrasU[indiceElementoSeleccionadoParaSerEntrenado]);//voy agregando aleatoriamente las muestras a entrenar
                muestrasU.RemoveAt(indiceElementoSeleccionadoParaSerEntrenado);
            }
            //Aquí no importa el orden, porque son para probar
            for (int i = 0; i < cantidadMuestrasAProbarA; i++)
                todasMuestrasRestantesAProbar.Add(muestrasA[i]);
            for (int i = 0; i < cantidadMuestrasAProbarE; i++)
                todasMuestrasRestantesAProbar.Add(muestrasE[i]);
            for (int i = 0; i < cantidadMuestrasAProbarI; i++)
                todasMuestrasRestantesAProbar.Add(muestrasI[i]);
            for (int i = 0; i < cantidadMuestrasAProbarO; i++)
                todasMuestrasRestantesAProbar.Add(muestrasO[i]);
            for (int i = 0; i < cantidadMuestrasAProbarU; i++)
                todasMuestrasRestantesAProbar.Add(muestrasU[i]);
        }
    }
}
